package br.com.ufc.apsoo.hotelar.controller;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;
import javax.faces.model.SelectItem;

import br.com.ufc.apsoo.hotelar.dao.ApartamentoDao;
import br.com.ufc.apsoo.hotelar.dao.ClienteDao;
import br.com.ufc.apsoo.hotelar.dao.PeriodoDao;
import br.com.ufc.apsoo.hotelar.dao.ReservaDao;
import br.com.ufc.apsoo.hotelar.dao.TipoApartamentoDao;
import br.com.ufc.apsoo.hotelar.dao.impl.ApartamentoDaoImpl;
import br.com.ufc.apsoo.hotelar.dao.impl.ClienteDaoImpl;
import br.com.ufc.apsoo.hotelar.dao.impl.PeriodoDaoImpl;
import br.com.ufc.apsoo.hotelar.dao.impl.ReservaDaoImpl;
import br.com.ufc.apsoo.hotelar.dao.impl.TipoApartamentoDaoImpl;
import br.com.ufc.apsoo.hotelar.model.Apartamento;
import br.com.ufc.apsoo.hotelar.model.Cliente;
import br.com.ufc.apsoo.hotelar.model.Periodo;
import br.com.ufc.apsoo.hotelar.model.Reserva;
import br.com.ufc.apsoo.hotelar.model.TipoApartamento;

public class ReservaController {
	private String nomeCliente;
	private DataModel<Cliente> clientes;
	private Cliente cliente;
	private Date checkin;
	private Date checkout;
	private Integer tipoApartamento;
	private Integer apartamento;
	
	private ClienteDao clienteDao;
	private ApartamentoDao apartamentoDao;
	private ReservaDao reservaDao;
	private TipoApartamentoDao tipoApartDao;
	private PeriodoDao periodoDao;
	
	private List<SelectItem> tipoAparts;
	private List<SelectItem> aparts;
	
	public ReservaController() {
		clientes = new ListDataModel<Cliente>();
		cliente = new Cliente();
		clienteDao = new ClienteDaoImpl();
		apartamentoDao = new ApartamentoDaoImpl();
		reservaDao = new ReservaDaoImpl();
		tipoApartDao = new TipoApartamentoDaoImpl();
		periodoDao = new PeriodoDaoImpl();
		
		tipoAparts = new ArrayList<SelectItem>();
		aparts = new ArrayList<SelectItem>();
	}
	
	public String buscarCliente() {
		clientes = new ListDataModel<Cliente>(clienteDao.getClienteByNome(nomeCliente));
		return "reserva";
	}
	
	public String selecionarCliente() {
		cliente = clientes.getRowData();
		
		return "reserva";
	}
	
	public String realizarReserva() {
		Apartamento apartamento = apartamentoDao
				.getApartamentoById(this.apartamento);
		if (cliente != null && apartamento != null) {
			Periodo periodo = new Periodo();
			periodo.setInicio(checkin);
			periodo.setFim(checkout);
			periodoDao.save(periodo);
			
			Reserva reserva = new Reserva();
			reserva.setCliente(cliente);
			reserva.setApartamento(apartamento);
			reserva.setPeriodo(periodo);
			reserva.setStatus(true);
			reservaDao.save(reserva);
		}
		return "index";
	}
	
	public void carregaListaTipoAparts() {
		List<TipoApartamento> tipoApartsList = tipoApartDao.list();
		for (TipoApartamento ap : tipoApartsList) {
			tipoAparts.add(new SelectItem(ap.getId(), ap.getNome()));
		}
	}
	
	public void carregaApartamentos() {
		if (tipoApartamento != null && tipoApartamento != 0 && checkin != null && checkout != null) {
			try {
				List<Apartamento> apartList = apartamentoDao
						.getApartamentoByTipoAndDisponivelNoPeriodo(new TipoApartamento(
								tipoApartamento), checkin, checkout);
				for(Apartamento ap : apartList) {
					aparts.add(new SelectItem(ap.getId(), ap.getNumero().toString()));
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
	
	public String getNomeCliente() {
		return nomeCliente;
	}

	public void setNomeCliente(String nomeCliente) {
		this.nomeCliente = nomeCliente;
	}

	public Date getCheckin() {
		return checkin;
	}

	public void setCheckin(Date checkin) {
		this.checkin = checkin;
	}

	public Date getCheckout() {
		return checkout;
	}

	public void setCheckout(Date checkout) {
		this.checkout = checkout;
	}

	public Integer getTipoApartamento() {
		return tipoApartamento;
	}

	public void setTipoApartamento(Integer tipoApartamento) {
		this.tipoApartamento = tipoApartamento;
	}

	public Integer getApartamento() {
		return apartamento;
	}

	public void setApartamento(Integer apartamento) {
		this.apartamento = apartamento;
	}

	public List<SelectItem> getTipoAparts() {
		return tipoAparts;
	}

	public void setTipoAparts(List<SelectItem> tipoAparts) {
		this.tipoAparts = tipoAparts;
	}

	public List<SelectItem> getAparts() {
		return aparts;
	}

	public void setAparts(List<SelectItem> aparts) {
		this.aparts = aparts;
	}

	public DataModel<Cliente> getClientes() {
		return clientes;
	}

	public void setClientes(DataModel<Cliente> clientes) {
		this.clientes = clientes;
	}

	public Cliente getCliente() {
		return cliente;
	}

	public void setCliente(Cliente cliente) {
		this.cliente = cliente;
	}

}
